from flask import Flask
from app.config import Config
from app.models.knowledge_base import KnowledgeBase
from app.models.database import DorisDatabase
from app.models.llm_agent import LLMAgent, CustomCallbackHandler
from app.api.kb_api import init_kb_api
from app.api.db_api import init_db_api
from app.api.llm_api import init_llm_api
from app.main.routes import init_main_routes
from langchain.agents import Tool
from flask_cors import CORS
from loguru import logger
from app.utils.logging_config import setup_logger

def create_app(config_class=Config):
    """创建Flask应用"""

    app = Flask(__name__)
    CORS(app, supports_credentials=True)
    app.config.from_object(config_class)
    # 设置日志
    before_request, after_request = setup_logger(app.config)
    app.before_request(before_request)
    app.after_request(after_request)

    logger.info("应用初始化开始")  # 直接使用 loguru 的 logger

    # 初始化知识库
    kb = KnowledgeBase(
        input_dir=app.config['INPUT_DIR'],
        knowledge_base_path=app.config['KNOWLEDGE_BASE_PATH']
    )

    # 初始化数据库
    db = DorisDatabase(
        db_config=app.config['DB_CONFIG']
    )

    kb_tool = Tool(
        name="Knowledge Base",
        func=kb.query,
        description="使用此工具基于本地知识库回答问题。适用场景：当用户问题涉及产品定义、业务术语解释、分析方法说明、行业知识等通用信息时使用。每个问题最多使用一次，优先使用此工具获取基础信息。"
    )

    db_tool = Tool(
        name="Mysql Query",
        func=db.execute_query,
        description="使用此工具查询Mysql数据库中的test库以获取特定数据。适用场景：当用户问题需要具体数据支撑（如销售额、用户数量、增长率等），且知识库无法提供时使用。输入必须是完整的SQL查询语句，默认查询test库，无需在SQL中指定库名。"
    )

    # 初始化LLM代理
    llm_agent = LLMAgent(
        llm_config=app.config['LLM_CONFIG'],
        kb_tool=kb_tool,
        db_tool=db_tool
    )

    # 注册蓝图
    app.register_blueprint(init_main_routes(llm_agent))
    app.register_blueprint(init_kb_api(kb))
    app.register_blueprint(init_db_api(db))
    app.register_blueprint(init_llm_api(llm_agent))

    logger.info("应用初始化完成")

    return app